package com.vhall.component.controller.room.facade;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vhall.component.entity.account.dto.IndexDto;
import com.vhall.component.entity.export.dto.AdminExportRoomQueryCondition;
import com.vhall.component.entity.inav.vo.*;
import com.vhall.component.entity.rebroadcast.vo.ListReqVo;
import com.vhall.component.entity.record.vo.RoomRspVO;
import com.vhall.component.entity.room.dto.RoomExtendsDTO;
import com.vhall.component.entity.room.dto.RoomJoinsEntityDTO;
import com.vhall.component.entity.room.dto.RoomWatermarkDTO;
import com.vhall.component.entity.room.dto.RoomsEntityDTO;
import com.vhall.component.entity.room.vo.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * @author guoxin.wang
 * @date 2021/7/12 17:30
 */
@FeignClient(value = "RoomInnerFacade", path = "/v4/inner/room")
public interface RoomInnerFacade {

    /**
     * 查询信息
     *
     * @param roomId room id
     * @return room info
     */
    @GetMapping("/info")
    RoomsEntityDTO getRoomInfo(@RequestParam("id") String roomId);

    /**
     * 查询信息
     *
     * @param ilId 房间id
     * @return 房间信息
     */
    @GetMapping("/get-room-by-id")
    RoomsEntityDTO getRoomInfoByIlId(@RequestParam("ilId") String ilId);

    /**
     * 查询信息
     *
     * @param roomId 房间id
     * @return RoomExtendsDTO
     */
    @GetMapping("/get-roomextends-by-roomid")
    RoomExtendsDTO getRoomExtendsByRoomId(@RequestParam("roomId") String roomId);

    /**
     * 检查roomid格式是否正确
     *
     * @param roomId 房间id
     */
    @GetMapping("/check-room-id")
    void checkRoomId(@RequestParam("roomId") String roomId);

    /**
     * 根据roomIds获取数据
     *
     * @param roomIds 房间id
     * @return List<RoomsEntityDTO>
     */
    @GetMapping("/get-room-by-ids")
    List<RoomsEntityDTO> getRoomInfoByRoomIds(@RequestParam("roomIds") List<String> roomIds);

    /**
     * 获取房间数据
     *
     * @param accountId 用户id
     * @param roomId    房间id
     * @return RoomJoinsEntityDTO
     */
    @GetMapping("/join-info")
    RoomJoinsEntityDTO getRoomJoinInfo(@RequestParam("accountId") Integer accountId,
                                       @RequestParam("roomId") String roomId);


    /**
     * 设置问卷状态
     *
     * @param joinId 房间加入情况表id
     * @param flag   问卷状态
     * @return 文件状态是否设置成功
     */
    @GetMapping("/set-question-flag")
    Boolean setQuestionFlag(@RequestParam("joinId") Integer joinId,
                            @RequestParam("flag") Integer flag);

    /**
     * 设置房间'发送表情限频'
     *
     * @param roomId        房间id
     * @param giftFrequency '发送表情限频'
     * @return 是否设置成功
     */
    @PostMapping("/set-gift-frequency")
    Boolean setGiftFrequency(@RequestParam("roomId") String roomId,
                             @RequestParam("giftFrequency") Integer giftFrequency);

    /**
     * 获取当前开播房间
     *
     * @return 开播房间列表List<RoomsEntityDTO>
     */
    @GetMapping("/list-online-channel")
    List<RoomsEntityDTO> listOnlineChannel();

    /**
     * 指定账号下获取当前开播房间
     *
     * @param accountId 用户账号id
     * @return 开播房间列表List<RoomsEntityDTO>
     */
    @GetMapping("/list-online-channel-account")
    List<RoomsEntityDTO> listOnlineChannelOnAccount(Integer accountId);

    /**
     * 查询当前在线人数
     *
     * @param reqVO 参数
     * @return GetOnlineListRspVO
     */
    @PostMapping(value = "/get-online-list", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    GetOnlineListRspVO getOnlineList(GetOnlineListReqVO reqVO);

    /**
     * 获取当前在直播间的人
     *
     * @param accountId 账户id
     * @param roomId    房间id
     * @return RoomJoinsEntityDTO
     */
    @GetMapping("/get-room-joins")
    RoomJoinsEntityDTO getRoomJoins(@RequestParam("accountId") Integer accountId,
                                    @RequestParam("roomId") String roomId);

    /**
     * 更新 roomJoins表
     *
     * @param roomJoinInfo 加入房间信息
     * @param type         设置设备检测类型 1麦克风，2摄像头
     * @param status       设置设备检测状态 0关闭 1打开
     */
    @GetMapping("/update-room-joins")
    void updateRoomJoins(RoomJoinsEntityDTO roomJoinInfo, @RequestParam("type") String type, @RequestParam("status") String status);

    /**
     * 更新 roomJoins表
     *
     * @param roomJoinInfo 加入房间信息
     */
    @GetMapping("/update-room-joins-by-id")
    void updateRoomJoinsById(RoomJoinsEntityDTO roomJoinInfo);

    /**
     * 获取当前在直播间的人
     *
     * @param thirdId 三方id
     * @param roomId  房间id
     * @return RoomJoinsEntityDTO
     */
    @GetMapping("/get-current-join-user-by-third-Id")
    RoomJoinsEntityDTO getCurrentJoinUserByThirdId(@RequestParam("roomId") String roomId,
                                                   @RequestParam("thirdId") Integer thirdId);

    /**
     * 批量禁言
     *
     * @param roomId           房间Id
     * @param accountIdList    用户Id列表
     * @param status           状态
     * @param thirdPartyUserId thirdPartyUserId
     * @return 返回参数
     */
    @GetMapping("/batch-banned")
    Boolean batchBanned(@RequestParam("roomId") String roomId, @RequestParam("accountIdList") List<String> accountIdList, @RequestParam("status") Integer status, @RequestParam("thirdPartyUserId") Integer thirdPartyUserId);

    /**
     * 获得当前房间的禁言人数
     *
     * @param roomId 房间Id
     * @return 返回禁言人数
     */
    @GetMapping("/get-banned-num")
    Integer getBannedNum(@RequestParam("roomId") String roomId);

    /**
     * 批量踢出
     *
     * @param roomId           房间Id
     * @param accountIdList    用户Id列表
     * @param status           状态
     * @param thirdPartyUserId thirdPartyUserId
     * @return 返回参数
     */
    @GetMapping("/batch-kick")
    Boolean batchKick(@RequestParam("roomId") String roomId, @RequestParam("accountIdList") List<String> accountIdList, @RequestParam("status") Integer status, @RequestParam("thirdPartyUserId") Integer thirdPartyUserId);

    /**
     * 获取当前房间的禁言列表
     *
     * @param reqVO 禁言列表的请求参数
     * @return 返回禁言列表
     */
    @GetMapping("/get-banned-list")
    BannedAndKickedListRspVO getBannedList(BannedKickedReqVO reqVO);

    /**
     * 获取当前房间的禁言列表
     *
     * @param reqVO 禁言列表的请求参数
     * @return 返回禁言列表
     */
    @GetMapping("/get-banned-list2")
    BannedKickedListRspVO getBannedList2(BannedKickedReqVO reqVO);

    /**
     * 获取当前房间的 禁言和剔出用户列表
     *
     * @param reqVO 踢出列表的请求参数
     * @return 返回踢出列表
     */
    @GetMapping("/list-banned-kicked")
    BannedAndKickedListRspVO listBannedKicked(BannedKickedReqVO reqVO);

    /**
     * 获取当前房间的踢出列表
     *
     * @param reqVO 踢出列表的请求参数
     * @return 返回踢出列表
     */
    @GetMapping("/get-kicked-list")
    BannedAndKickedListRspVO getKickedList(BannedKickedReqVO reqVO);

    /**
     * 获取当前房间的踢出列表
     *
     * @param reqVO 踢出列表的请求参数
     * @return 返回踢出列表
     */
    @GetMapping("/get-kicked-list2")
    BannedKickedListRspVO getKickedList2(BannedKickedReqVO reqVO);

    /**
     * 根据条件查找join数据
     *
     * @param reqVO 请求参数
     * @return 返回参数
     */
    @GetMapping("/query-room-joins")
    RoomJoinsEntityDTO queryRoomJoinsBySelectOne(QueryRoomJoinsBySelectOneReqVO reqVO);

    /**
     * 获取互动房间内用户列表
     *
     * @param reqVO 请求参数
     * @return 返回参数
     */
    @GetMapping("/get-user-list")
    UserListPage<GetUserListRspVO> getUserList(GetUserListReqVO reqVO);

    /**
     * 获取supply信息
     *
     * @param ilId 房间iid
     * @return RoomSupplyEntityDTO
     */
    @GetMapping("/get-room-supply-by-ilid")
    RoomSupplyEntityDTO getRoomSupplyByIlId(@RequestParam("ilId") Integer ilId);

    /**
     * 获取supply信息
     *
     * @param room         参数
     * @param profilePhoto 用户头像照片
     * @param accountId    用户id
     * @param roleName     权限标识
     * @param username     用户名称
     * @param nickname     用户昵称
     * @return supply信息
     */
    @GetMapping("/update-or-insert-room-join")
    RoomJoinsEntityDTO updateOrInsertRoomJoin(RoomsEntityDTO room,
                                              @RequestParam("profilePhoto") String profilePhoto,
                                              @RequestParam("accountId") Integer accountId,
                                              @RequestParam("roleName") Integer roleName,
                                              @RequestParam("username") String username,
                                              @RequestParam("nickname") String nickname);

    /**
     * 更新获奖人信息
     *
     * @param roomJoinsEntityDTO 参数
     * @param roomId             房间id
     * @param accountIds         用户id列表
     * @return 更新数量
     */
    @GetMapping("/update-lottery-winner")
    Integer updateLotteryWinner(RoomJoinsEntityDTO roomJoinsEntityDTO,
                                @RequestParam("roomId") String roomId,
                                @RequestParam("accountIds") List<Integer> accountIds
    );

    /**
     * 根据加入Id更新签到状态
     *
     * @param roomId           房间Id
     * @param thirdPartyUserId 第三方id
     */
    @GetMapping("update-is-signed-by-join-id")
    void updateIsSignedByJoinId(@RequestParam("roomId") String roomId, @RequestParam("thirdPartyUserId") String thirdPartyUserId);

    /**
     * 根据加入Id更新投票状态
     *
     * @param roomId           房间Id
     * @param thirdPartyUserId 第三方id
     * @return 更新数量
     */
    @PostMapping("update-is-vote-answer")
    int updateIsAnsweredVoteByJoinId(@RequestParam("roomId") String roomId, @RequestParam("thirdPartyUserId") String thirdPartyUserId);

    /**
     * 根据roomid和token查找roomjoins
     *
     * @param roomId           房间ID
     * @param thirdPartyUserId thirdPartyUserId
     * @return 返回RoomJoins
     */
    @GetMapping("get-room-joins-info-by-account")
    RoomJoinsEntityDTO getRoomJoinsByRoomIdAndThirdId(@RequestParam("roomId") String roomId,
                                                      @RequestParam("thirdPartyUserId") Integer thirdPartyUserId);

    /**
     * 根据roomId查找房间信息 (只查找了数据库，没查缓存)
     *
     * @param roomId 房间Id
     * @return 返回房间信息
     */
    @GetMapping("get-room-entity-from-db")
    RoomsEntityDTO getRoomsEntityInfo(String roomId);

    /**
     * 根据ilId recordId查找房间信息
     *
     * @param ilId     房间id
     * @param recordId 默认回放id
     * @return 返回房间信息
     */
    @GetMapping("/get-count-by-il-and-record")
    Integer getCountByIlidAndRecordId(@RequestParam("ilId") String ilId, @RequestParam("recordId") String recordId);

    /**
     * 根据ilId更新房间信息
     *
     * @param entity 房间Id
     * @return 返回房间信息
     */
    @PostMapping("update-by-il")
    Integer updateByIl(RoomsEntityDTO entity);

    /**
     * 根据ilIds查询房间信息
     *
     * @param ilIdlist 房间Ids
     * @return 返回房间信息
     */
    @GetMapping("select-room-list")
    List<RoomRspVO> selectRoomList(@RequestParam("ilIdlist") List<Integer> ilIdlist);

    /**
     * 根据主键id更新房间的点赞数
     *
     * @param rooms 房间信息
     */
    @PostMapping("/update-like-by-id")
    void updateLikeById(RoomsEntityDTO rooms);

    /**
     * 根据roomId和senderIds查询房间信息
     *
     * @param roomId    房间号
     * @param senderIds senderIds
     * @return 返回房间信息
     */
    @GetMapping("/get-room-by-senderids")
    Map<Integer, RoomJoinsEntityDTO> getRoomInfoBySenderIds(@RequestParam("roomId") String roomId, @RequestParam("senderIds") String senderIds);

    /**
     * 根据用户ids获取房间信息
     *
     * @param roomId     房间id
     * @param accountIds 账户id列表
     * @return List<RoomJoinsEntityDTO>
     */
    @GetMapping("/get-room-by-accountids")
    List<RoomJoinsEntityDTO> getRoomInfoByAccountIds(@RequestParam("roomId") String roomId, @RequestParam("accountIds") String accountIds);

    /**
     * 根据房间主键查找房间信息(只查数据库，不查缓存)
     *
     * @param ilId 房间表主键
     * @return 返回房间信息
     */
    @GetMapping("/info-by-id")
    RoomsEntityDTO getRoomInfoById(@RequestParam("ilId") Integer ilId);

    /**
     * 根据roomIds查找所有房间信息 (只查找了数据库，没查缓存)
     *
     * @param roomIds 房间Ids
     * @return 返回房间信息
     */
    @GetMapping("/get-rooms-by-roomids")
    List<RoomsEntityDTO> getRoomsInfoByRoomIds(@RequestParam("roomIds") String roomIds);

    /**
     * 转播列表根据条件查询房间数据
     *
     * @param reqVo 参数
     * @return Map<String, Object>
     */
    @GetMapping("/get-room-by-rebroadcast")
    Map<String, Object> getRoomsEntityByRebroadcastList(ListReqVo reqVo);

    /**
     * 获取join信息
     *
     * @param reqVO 参数
     * @return List<RoomJoinsEntityDTO>
     */
    @GetMapping("/get-room-joins-datas")
    List<RoomJoinsEntityDTO> getRoomJoinsList(QueryRoomJoinsReqVO reqVO);

    /**
     * 获取主讲人
     *
     * @param roomId 房间id
     * @return RoomJoinsEntityDTO
     */
    @GetMapping("/get-host-user-info-by-room-id")
    RoomJoinsEntityDTO getHostUserInfoByRoomId(@RequestParam("roomId") String roomId);

    /**
     * 获取数据条数
     *
     * @param beginTime 开始时间
     * @return 统计信息IndexDto
     */
    @GetMapping("/getCounts")
    IndexDto getCount(String beginTime);

    /**
     * admin获取房间聊天总数
     *
     * @param ilId      房间Id
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return 返回聊天总数
     */
    @GetMapping("/sum-message-total")
    Integer sumMessageTotalByAccountId(@RequestParam("ilId") Integer ilId, @RequestParam("beginTime") LocalDateTime beginTime, @RequestParam("endTime") LocalDateTime endTime);

    /**
     * 针对admin导出计算总条数
     *
     * @param condition 查询条件
     * @return 总条数
     */
    @GetMapping("count-for-admin-export")
    int countRoomForAdminExport(AdminExportRoomQueryCondition condition);

    /**
     * 获取房间暖场信息
     *
     * @param ilId 房间id
     * @return 暖场信息
     */
    @GetMapping("/get-room-warm-info-by-id")
    Map<String, Object> getRoomWarmInfo(@RequestParam("ilId") Integer ilId);

    /**
     * 获取 roomsupply信息
     *
     * @param roomId 房间id
     * @return roomsupply信息
     */
    @GetMapping("/get-room-supply-by-room-id")
    RoomSupplyEntityDTO getRoomSupplyByRoomId(@RequestParam("roomId") String roomId);


    /**
     * 根据房间id更新扩展表开关状态
     *
     * @param roomId 房间id
     * @param status 功能开关状态 1.开启 0.关闭
     * @param type   功能类型 scrolling_status跑马灯 custom_tag_status 自定义菜单
     *               filter_words_status 敏感词 pendant_status 挂件 question_status 问卷
     */
    @GetMapping("/update-room-config-by-room-id")
    void updateConfigValueByRoomId(@RequestParam("roomId") String roomId, @RequestParam("status") Integer status, @RequestParam("type") String type);

    /**
     * 根据用户id更新或新增账号级扩展表开关状态
     *
     * @param accountId 用户id
     * @param status    功能开关状态 1.开启 0.关闭
     * @param type      功能类型 filter_words_status 敏感词 pendant_status 挂件
     */
    @GetMapping("/insertOrUpdate-roomConfig-by-account-id")
    void insertOrUpdateRoomConfigByAccountId(@RequestParam("accountId") Integer accountId, @RequestParam("status") Integer status, @RequestParam("type") String type);

    /**
     * 根据账户id与关键信息查询房间列表信息
     *
     * @param roomInneristVO 请求参数
     * @return Page<RoomsEntityVO>
     */
    @PostMapping("/getRoomsListByAccountId")
    Page<RoomsEntityVO> getRoomsListByAccountId(@Validated RoomInnerListVO roomInneristVO);

    /**
     * 获取默认水印模板id
     *
     * @return 水印模板id
     */
    String getDefaultWatermarkTemplateId();

    /**
     * 设置水印模板id
     *
     * @param watermarkTemplateId 水印模板id
     */
    void setDefaultWatermarkTemplateId(Integer watermarkTemplateId);

    /**
     * 清除房间水印
     *
     * @param tempId
     */
    void clearRoomWatermark(String tempId);

    /**
     * 获取水印信息,如果传递水印 id 为空则获取默认水印
     *
     * @param watermarkTempId 水印模板 id
     * @return 水印模板信息
     */
    RoomWatermarkDTO getRoomWatermark(Integer watermarkTempId);
}
